package controllers;

import DTO.ConstantesDTO;
import DTO.UsuarioDTO;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import logicBusiness.AutenticacionBL;

/**
 * Clase control del Login.
 * @author eagle_eye
 *
 */
public class LoginControl {

    /**
     * Metodo que controla las validaciones necesarias para el modulo de Login.
     * @param nombre
     * @return Retorna un valor entero entre 1 y 6 para verificar posibles errores
     */
    public int validate(UsuarioDTO usuario) throws Exception {
        if (!validarFormatoNombre(usuario.getUsuario())) {
            //System.out.println("nombre" + usuario.getNombreUsuario());
            return ConstantesDTO.FORMATO_NOMBRE_INCORRECTO;
        }
        if (validarFormatoContrasenia(usuario.getPassword()) == 0) {
            return ConstantesDTO.FORMATO_CONTRASENA_INCORRECTO;
        }
        if (!validarLongitudNombre(usuario.getUsuario())) {
            return ConstantesDTO.LONGITUD_NOMBRE_INCORRECTO;
        }
        if (!validarLongitudContrasenia(usuario.getPassword())) {
            return ConstantesDTO.LONGITUD_CONTRASENA_INCORRECTO;
        }
        if (!validarUsuarioExiste(usuario)) {
            return ConstantesDTO.USUARIO_INEXISTENTE;
        }
        return ConstantesDTO.LOGIN_EXITOSO;
    }

    /**
     * Metdos que valida el formato del nombre
     * @param nombre
     * @return TRUE si el formato es correcto, FALSE si el formato no es correcto
     */
    boolean validarFormatoNombre(final String nombre) {
        Pattern pattern =
                pattern = Pattern.compile("((?=.*\\d)(?=.*[a-z])(?=.*[A-Z]).*([0-9]))");
        Matcher matcher =
                pattern.matcher(nombre);
        if (!matcher.find()) {
            System.out.println("El nombre debe ser alfanumerico.");
            return false;
        }
        pattern = Pattern.compile("[a-zA-Z].*[0-9]");
        matcher = pattern.matcher(nombre);

        if (!matcher.find()) {
            System.out.println("El nombre debe ser alfanumerico.");
            return false;
        }
        return true;
    }

    /**
     * Este metodo retorna 1 si la contrasenia cumple con el formato,
     * 0 en otro caso.
     * @param String pass
     * @return boolean
     */
    int validarFormatoContrasenia(final String pass) {

        Pattern pattern = Pattern.compile("((?=.*\\d)(?=.*[a-z])(?=.*[A-Z])([a-zA-Z]).*([0-9]))");
        Matcher matcher = pattern.matcher(pass);
        if (!matcher.find()) {
            System.out.println("La contrasenia debe tener por lo menos una minusscula y una mayuscula y un numero.");
            return 0;
        }
        return 1;
    }

    /**
     * Valida la longitus del nombre
     * @param nombre
     * @return TRUE si la longitud es correcta, FALSE en caso contrario
     */
    boolean validarLongitudNombre(final String nombre) throws Exception {
        if (nombre.length() >= ConstantesDTO.MIN_LONG_NAME && nombre.length() <= ConstantesDTO.MAX_LONG_NAME) {
            return true;
        }
        System.out.print("El nombre debe tener entre 5 y 20 caracteres");
        return false;
    }

    /**
     * Valida la longitud de la contrasenia
     * @param pass
     * @return TRUE si la longitud es correcta, FALSE en caso contrario
     */
    boolean validarLongitudContrasenia(final String pass) {
        if (pass.length() >= ConstantesDTO.MIN_LONG_PASS && pass.length() <= ConstantesDTO.MAX_LONG_PASS) {
            return true;
        }
        System.out.print("La contrasenia debe tener entre 5 y 20 caracteres");
        return false;

    }

    /**
     * Metodo que valida si el usuario existe en al BD
     * @param usuario
     * @return true si esxiste el usuario; false, en otro caso
     */
    boolean validarUsuarioExiste(final UsuarioDTO usuario) {
        AutenticacionBL aBL = new AutenticacionBL();
        return aBL.login(usuario.getUsuario());
    }
}
